package br.com.sistema.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.persistence.Query;

import br.com.sistema.entidade.Produto;
import br.com.sistema.entidade.Venda;

public class VendaDAOImplements extends GenericDAOImplements<Venda> implements
		VendaDAO {

	private static final long serialVersionUID = 1L;

	public VendaDAOImplements() {
		super(Venda.class);
	}

	@Override
	public List<Venda> buscarVendas(Date dataInicial, Date dataFinal, Integer flagStatusVenda) {
		Query query;
		try {
			abrirTransacao();
			if(flagStatusVenda.equals(2)){
				query = em.createQuery("Select v from Venda v where dataVenda between :dataInicio and :dataFinal");
			}else{
				query = em.createQuery("Select v from Venda v where dataVenda between :dataInicio and :dataFinal and flagVendaAtiva = :flagStatusVenda");
				query.setParameter("flagStatusVenda", flagStatusVenda);
			}
			
			query.setParameter("dataInicio", dataInicial);
			query.setParameter("dataFinal", dataFinal);
			
			List<Venda> lista = query.getResultList();
			return lista;
		} finally {
			fecharTransacao();
		}
	}

	@Override
	public void salvar(Venda venda) {
		try {
			abrirTransacao();
			this.em.persist(venda);
			ajustarQuantidadeDeProdutosVendidos(venda,false);
			fecharECommitarTransacao();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			rollback();
		}
	}

	@Override
	public void atualizar(Venda venda){
		try {
			abrirTransacao();
			this.em.merge(venda);
			ajustarQuantidadeDeProdutosVendidos(venda,true);
			fecharECommitarTransacao();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			rollback();
		}
	}
	
	private void ajustarQuantidadeDeProdutosVendidos(Venda venda, boolean flagIncrementoDecremento){
		List<Produto> produtosJaContados = new ArrayList<Produto>();
		boolean achou = false;
		Iterator<Produto> cursor = venda.getProduto().iterator();
		while (cursor.hasNext()) {
			Produto produto = cursor.next();
			produto.setQuantidadeVendida(contadorDeProdutosVendidos(
					produto, venda.getProduto(), flagIncrementoDecremento));
			
			for (Produto p : produtosJaContados) {
				if(p.getDescricao().equals(produto.getDescricao())){
					achou = true;
				}
			}
			
			if(!achou){
				this.em.merge(produto);
				produtosJaContados.add(produto);
				achou = false;
				
			}
		}
	}
	
	private Integer contadorDeProdutosVendidos(Produto produto,
			List<Produto> lista, boolean flagIncrementoDecremento) {
		int contador = 0;
		for (Produto prodDaLista : lista) {
			if (produto.getDescricao().equals(prodDaLista.getDescricao())) {
				contador++;
			}
		}
		if (produto.getQuantidadeVendida() == null) {
			return contador;
		} else {
			if(flagIncrementoDecremento){
				return produto.getQuantidadeVendida() - contador;
			}else{
				return produto.getQuantidadeVendida() + contador;
			}
		}
	}
}
